package de.preisrobot.business.parser.notebooksbilliger;

import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.List;

import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.Source;

import org.apache.log4j.Logger;

import de.preiscrawler.AlleAnbieter;
import de.preisrobot.business.parser.AbstractParser;
import de.preisrobot.entity.Artikel;
import de.preisrobot.service.internal.PreisRobotParserException;

public class NoteBooksBilligerParser extends AbstractParser
{
   private static Logger logger = Logger.getLogger(NoteBooksBilligerParser.class);

   @Override
   public void parseStream(List<Artikel> list, InputStream in) throws IOException, PreisRobotParserException
   {
      Source s = new Source(in);
      parserSource(list, s);
   }

   private void parserSource(List<Artikel> list, Source s) throws PreisRobotParserException
   {
      Element elementById = s.getElementById("listing");

      if (null == elementById)
      {
         // bei Suche andere CSS Klasse
//         elementById = s.getAllElementsByClass("listing");
         if (null == elementById)
         {
            try
            {
               FileWriter w = new FileWriter("d:\\notebooksbilliger.html");
               w.write(s.toString());
               w.flush();

               w.close();
            }
            catch (IOException e)
            {
               e.printStackTrace();
            }

            throw new PreisRobotParserException("No element 'listing'");
         }
      }

      List<Element> everyListDiv = elementById.getAllElementsByClass("mouseover");

      for (Element listItemDivBox : everyListDiv)
      {
         Artikel a = new Artikel();
         parseImage(listItemDivBox, a);
         parseArtikelDesc(listItemDivBox, a);
         parserArtikelNr(listItemDivBox, a);
         parsePreis(listItemDivBox, a);

         praseProperties(listItemDivBox, a);

         list.add(a);
      }
   }

   private void praseProperties(Element listItemDivBox, Artikel a)
   {
      List<Element> elementDivList = listItemDivBox.getAllElementsByClass("passive");
      StringBuffer buf = new StringBuffer();

      for (Element element2 : elementDivList)
      {
         String artikelPropertieKey = element2.getAttributeValue("title");
         String artikelPropertieValue = element2.getTextExtractor().toString();
         buf.append(artikelPropertieKey + ":" + artikelPropertieValue + "\n");
      }

      a.setArtikelPreislink(buf.toString());
   }

   private void parsePreis(Element listItemDivBox, Artikel a)
   {

      List<Element> allElementsByClass = listItemDivBox.getAllElementsByClass("product_price_listing");

      if (allElementsByClass == null || allElementsByClass.isEmpty())
      {
         logger.warn("Notebooksbilliger kein Preis gefunden class('product_price')");
         return;
      }

      Element spanElem = allElementsByClass.get(0);
      String preisText = spanElem.getContent().toString();
      preisText = preisText.replaceAll("&nbsp;", "");
      preisText = preisText.replaceAll("&euro;", "");

      a.setPreis(preisText);

   }

   private void parserArtikelNr(Element listItemDivBox, Artikel a)
   {
      List<Element> allElementsByClass = listItemDivBox.getAllElementsByClass("product_name");
      Element elem = allElementsByClass.get(0);
      List<Element> allElementsByClass2 = elem.getAllElements("a");
      Element aArtikelDesc = allElementsByClass2.get(0);
      String artikellink = aArtikelDesc.getAttributeValue("href");
      String artikelnr = aArtikelDesc.getTextExtractor().toString();

      a.setArtikelNr(artikelnr);
      a.setArtikelLink(artikellink);

   }

   private void parseArtikelDesc(Element listItemDivBox, Artikel a)
   {
      List<Element> allElementsByClass = listItemDivBox.getAllElementsByClass("middle");
      Element elem = allElementsByClass.get(0);
      List<Element> allElementsByClass2 = elem.getAllElementsByClass("short_description");
      Element divShotDesc = allElementsByClass2.get(0);
      String shortDesc = divShotDesc.getTextExtractor().toString();

      a.setDesc(shortDesc);

   }

   private void parseImage(Element element, Artikel a)
   {
      List<Element> allElementsByClass = element.getAllElementsByClass("p_image");

      Element div_class_p_image = allElementsByClass.get(0);

      List<Element> allElements = div_class_p_image.getAllElements("img");

      Element element2 = allElements.get(0);

      a.setImageLink(element2.getAttributeValue("src"));
   }

   @Override
   public int getAnbieter()
   {
      return AlleAnbieter.NOTEBOOKSBILLIGER;
   }

   @Override
   public void parseStream(List<Artikel> list, Reader in) throws IOException, PreisRobotParserException
   {
      Source s = new Source(in);
      parserSource(list, s);
   }
}
